package org.deng.java.reflect;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//java中反射的demo
/*
*   反射的主要类位于 java.lang.reflect 包中，主要包括以下几个关键类：
    Class：代表一个类或接口，包含了类的结构信息（如名称、构造函数、方法、字段等）。通过 Class 对象，可以获取类的元数据并操作类的实例。
    Constructor：代表类的构造方法，用于创建类的实例。
    Method：代表类的方法，可以通过它调用类的实例方法。
    Field：代表类的字段，可以获取或修改字段的值。
    Modifier：包含方法、字段和类的访问修饰符（如 public、private 等）。
*
* */
public class JavaReflectionDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {


        //获取Person类的Class对象
       Class<?>  personClass  = Class.forName("org.deng.java.uitl.Person");

       //获取并打印类名
        System.out.println("类名: "+personClass.getName());

        //获取构造方法
        Constructor<?> constructor = personClass.getConstructor(String.class, int.class);

        //使用构造函数创建Person对象实例
        Object personInstance = constructor.newInstance("沉默锦章",30);
        System.out.println(personInstance);

        //获取并调用getName 方法
        Method getNameMethod= personClass.getMethod("getName");
        String name = (String) getNameMethod.invoke(personInstance);
        System.out.println("名字: " + name);

        // 获取并调用 setAge 方法
        Method setAgeMethod = personClass.getMethod("setAge", int.class);
        setAgeMethod.invoke(personInstance, 35);

        // 获取并访问 age 字段
        Field ageField = personClass.getDeclaredField("age");
        ageField.setAccessible(true);
        int age = ageField.getInt(personInstance);
        System.out.println("年纪: " + age);
    }
}
